package com.itzhoun;

/**
 * @author 周楠
 * @Date 2023/01/14/下午 7:16
 */
public class DecoratorTest {

    /**
     * 装饰器模式
     * 定义：动态的将新功能附加到对象上。在对象功能扩展方面，它比继承更有弹性。
     * 1.Component（被装饰对象的基类）
     *
     *    定义一个对象接口，可以给这些对象动态地添加职责。
     *
     * 2.ConcreteComponent（具体被装饰对象）
     *
     *    定义一个对象，可以给这个对象添加一些职责。
     *
     * 3.Decorator（装饰者抽象类）
     *
     *    维持一个指向Component实例的引用，并定义一个与Component接口一致的接口。
     *
     * 4.ConcreteDecorator（具体装饰者）
     *
     *    具体的装饰对象，给内部持有的具体被装饰对象，增加具体的职责。
     */

    /**
     * 来源 https://www.cnblogs.com/pluto-charon/p/16030199.html
     *
     * 在星巴克咖啡店，有美式咖啡（LongBlack）、无因咖啡（Decaf）、意大利农咖啡（Espresso）等不同的咖啡种类，
     * 也可以添加牛奶（Milk）、豆浆（Soy）、巧克力(Chocolate)等调料。下面我们就以这个为例子讲解装饰器模式
     * @param args
     */

    public static void main(String[] args) {

        Drink longBlack = new LongBlack();
        //点一份美式咖啡
        System.out.println(longBlack.getDesc() + ",费用:" + longBlack.cost());

        //在添加一点牛奶
        longBlack = new Milk(longBlack);
        System.out.println("添加了" + longBlack.getDesc() + ",费用:" + longBlack.cost());


//        System.out.println(longBlack.toString());
        //在添加一点豆浆
        longBlack = new Soy(longBlack);
        System.out.println("添加了" + longBlack.getDesc() + ",费用:" + longBlack.cost());


    }
}
